﻿// 108. 奇数码问题.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;
/*
https://www.acwing.com/problem/content/110/
你一定玩过八数码游戏，它实际上是在一个 3×3 的网格中进行的，1 个空格和 1∼8 这 8 个数字恰好不重不漏地分布在这 3×3 的网格中。

例如：

5 2 8
1 3 _
4 6 7
在游戏过程中，可以把空格与其上、下、左、右四个方向之一的数字交换（如果存在）。

例如在上例中，空格可与左、上、下面的数字交换，分别变成：

5 2 8       5 2 _      5 2 8
1 _ 3       1 3 8      1 3 7
4 6 7       4 6 7      4 6 _
奇数码游戏是它的一个扩展，在一个 n×n 的网格中进行，其中 n 为奇数，1 个空格和 1∼n2−1 这 n2−1 个数恰好不重不漏地分布在 n×n 的网格中。

空格移动的规则与八数码游戏相同，实际上，八数码就是一个 n=3 的奇数码游戏。

现在给定两个奇数码游戏的局面，请判断是否存在一种移动空格的方式，使得其中一个局面可以变化到另一个局面。

输入格式
多组数据，对于每组数据：

第 1 行输入一个整数 n，n 为奇数。

接下来 n 行每行 n 个整数，表示第一个局面。

再接下来 n 行每行 n 个整数，表示第二个局面。

局面中每个整数都是 0∼n2−1 之一，其中用 0 代表空格，其余数值与奇数码游戏中的意义相同，保证这些整数的分布不重不漏。

输出格式
对于每组数据，若两个局面可达，输出 TAK，否则输出 NIE。

数据范围
1≤n<500
输入样例：
3
1 2 3
0 4 6
7 5 8
1 2 3
4 5 6
7 8 0
1
0
0
输出样例：
TAK
TAK
*/

const int N = 510;

typedef long long LL;
int q[N*N]; int w[N*N];
int n;
int mm1[N * N]; int idx1;
int mm2[N * N];	int idx2;




LL merge_sort(int l, int r) {
    if (l  >= r) return 0;

    int mid = l + r >> 1;
    LL res = merge_sort(l, mid) + merge_sort(mid + 1, r);
    int i = l; int j = mid + 1; int  k = 0;
    while (i <= mid && j <= r) {
        if (q[i] <= q[j]) w[k++] = q[i++];
        else {
            res += mid - i + 1;
            w[k++] = q[j++];
        }
    }

    while (i <= mid) w[k++] = q[i++];
    while (j <= r) w[k++] = q[j++];

    for (i = l, j = 0; i <= r; i++, j++) q[i] = w[j];

    return res;
}


int main()
{
    while (~scanf("%d", &n)) {
        idx1 = 0; idx2 = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int a; cin >> a;
                if (a) { mm1[idx1++] = a; }
            }
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int a; cin >> a;
                if (a) { mm2[idx2++] = a; }
            }
        }

        memcpy(q, mm1, sizeof mm1);
        LL res1 = merge_sort(0, idx1 - 1);

        memcpy(q, mm2, sizeof mm2);
        LL res2 = merge_sort(0, idx2 - 1);

        if (res1 % 2 == res2 % 2) {  cout << "TAK" << endl;}
        else {cout << "NIE" << endl;}
    }
	 

	

    return 0;
}
 